DNS 的记录

DNS 中所说的记录,指的是域名和 IP 的对应关系。根据使用场景,有不同类型的记录:

  • A记录:地址记录。如果一个域名配置了 A 记录,DNS 就会把域名解析成 A 记录指定的 IP 地址。

  • CNAME 记录:规范名称记录。如果一个域名配置了 CNAME 记录,DNS 就会把域名解析成 CNAME 记录指定的另外一个域名。A 记录和 CNAME 记录是互斥的,不能共存

  • NS 记录:域名服务器记录。返回保存下一级域名信息的服务器地址,它指定该域名应该由哪一台 DNS 服务器进行解析。

  • MX 记录:邮件记录。返回接收电子邮件的服务器地址。

  • PTR 记录:逆向查询记录。只用于从IP地址查询域名。

DNS 的工作机制(未引入 CDN)

我们在浏览器中直接输入的是域名,但是浏览器必须知道服务器的 ip 地址,才能建立 tcp 连接并进而发送 http 请求。那么,如何根据服务器域名查找服务器的 ip 地址呢?

  1. 浏览器地址栏中输入 https://join.qq.com,按下回车
  2. 浏览器从 url 中提取出域名 join.qq.com,查找浏览器缓存中( chrome://net-internals/#dns)是否存在该域名到 ip 地址的映射。若没有,进入下一步
  3. 查找操作系统缓存中是否存在该域名到 ip 地址的映射(命令行下 ipconfig/displaydns)。若没有,进入下一步
  4. 查找本机的 host 文件是否存在该域名到 ip 地址的映射。若没有,进入下一步
  5. 向本地 dns 发送查询请求,看本地 dns 是否缓存了该域名到 ip 地址的映射。若没有,进入下一步,开始进行域名的迭代解析
  6. 本地 dns 将域名发送给根dns,根dns 发现域名中包含 com,于是返回负责解析 com 的顶级dns的 ip 地址
  7. 本地 dns 将域名发送给顶级dns,顶级dns 发现域名中包含 qq.com,于是返回负责解析 qq.com 的权威dns的 ip 地址
  8. 本地 dns 将域名发送给权威dns,权威dns 发现域名中包含 join.qq.com,于是查找 A 记录,发现有一条 A 记录保存着 join.qq.com 到 ip 地址的映射,于是返回这个 ip 地址给本地 dns
  9. 本地 dns 将这个 ip 地址回传给浏览器
  10. 自此,浏览器已经拿到了服务器的 ip 地址,于是通过三次握手与服务器建立 tcp 连接,接着发送 http 请求

PS:顶级 dns 解析的是 .com,权威 dns 解析的是 join.qq.com,那么一开始根 dns 解析的是什么呢?其实它解析的是 .root,.root 是所有域名共有的后缀,即 join.qq.com实际上是 join.qq.com.root,不过一般都是省略不写的。

DNS 的工作机制(引入 CDN)

远距离通信时,通信效率是非常低的,所以一般会使用 CDN —— 在全球多个节点架设代理服务器,客户端就近向代理服务器(而不是源服务器)发送请求。

关于 CDN,有一些概念要了解一下:

  • 命中和回源:当 CDN 网络中的节点服务器刚好缓存了客户端所需要的资源,并且没有过期时,则称为命中缓存;否则,节点服务器还是需要转发请求到源服务器,回到源服务器请求资源,这个叫做回源。

    命中和回源各自对应着命中率和回源率,这是衡量 CDN 质量的两个指标。显然,好的 CDN 应该具有较高的命中率,具有较低的回源率。

  • CDN 的分类:

    • 按照拓扑结构划分:一个是分散式 CDN,即在全球部署尽可能多的代理服务器;另一种是整合式 CDN,只在主要的数据中心有少量节点,但节点性能更强大,包括网络、吞吐量以及抗 DDoS 的能力。
    • 按照内容分发方式划分:一个是 Push CDN,一个是 Pull CDN。前者是由内容服务器提前把内容 push 到 CDN 缓存起来;后者则是在用户访问内容时 CDN 才去 pull 目标资源并缓存起来

由于引入 CDN 之后,我们不再是向源服务器发送请求,所以需要的不再是源服务器的 ip 地址了,因此,DNS 的解析过程也发生了变化。

首先,前面的步骤还是一样的:

  1. 浏览器地址栏中输入 https://join.qq.com,按下回车
  2. 浏览器从 url 中提取出域名 join.qq.com,查找浏览器缓存中( chrome://net-internals/#dns)是否存在该域名到 ip 地址的映射。若没有,进入下一步
  3. 查找本机缓存中是否存在该域名到 ip 地址的映射(命令行下 ipconfig/displaydns)。若没有,进入下一步
  4. 查找本机的 host 文件是否存在该域名到 ip 地址的映射。若没有,进入下一步
  5. 向本地 dns 发送查询请求,看本地 dns 是否缓存了该域名到 ip 地址的映射。若没有,进入下一步,开始进行域名的迭代解析
  6. 本地 dns 将域名发送给根dns,根dns 发现域名中包含 com,于是返回负责解析 com 的顶级dns的 ip 地址
  7. 本地 dns 将域名发送给顶级dns,顶级dns 发现域名中包含 qq.com,于是返回负责解析 qq.com 的权威dns的 ip 地址

从第八步开始,发生了变化:

  1. 本地 dns 将域名发送给权威dns,权威dns 发现域名中包含 join.qq.com,于是查找 CNAME 记录和它对应的 A 记录。CNAME 记录的 name 是域名,value 是域名的一个别名,指示着一个全局负载均衡系统(GSLB),而 A 记录的 name 则是这个别名,value 是这个 GSLB 的 ip 地址。权威 dns 最终将这个 ip 地址返回给本地 dns
  2. 本地 dns 向 GSLB 发送请求。GSLB 根据本地 dns 的 ip 地址推测其地理位置,找出这个位置里最佳的本地负载均衡系统(SLB),并将 SLB 的 ip 地址返回给本地 dns
  3. 本地 dns 将这个 ip 地址回传给浏览器
  4. 浏览器向 SLB 发送请求。SLB 综合各种因素(距离、负载情况、响应速度、健康程度等),找出最佳的代理服务器节点,并返回这个节点的 ip 地址
  5. 浏览器向这个节点发送请求
  6. 节点判断自己的缓存中是否有浏览器请求的资源,若有的话是否已经过期,若存在且不过期,则命中;否则需要回源

DNS 优化方案

  1. 减少 DNS 的请求次数
  2. DNS 预解析:
<meta http-equiv="x-dns-prefetch-control" content="on">
<link rel="dns-prefetch" href="//www.img.com">
<link rel="dns-prefetch" href="//www.api.com">
<link rel="dns-prefetch" href="//www.test.com">